home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 June / PCWorld_2007-06_cd.bin / v cisle / tclock / tclocklight-040702-3.exe / source / property / selecticon.c < prev    next >
C/C++ Source or Header  |  2004-02-13  |  7KB  |  263 lines

  1. /*-------------------------------------------------------------
  2.   selecticon.c : "Select Icon" dialog
  3.   (C) Kazuto Sato 1997-2003
  4.   For the license, please read readme.txt.
  5.   
  6.   Written by Kazubon, Nanashi-san
  7. ---------------------------------------------------------------*/
  8.  
  9. #include "tcprop.h"
  10.  
  11. /* Globals */
  12.  
  13. BOOL SelectIconInDLL(HINSTANCE hInst, HWND hDlg, char* fname_index);
  14.  
  15. /* Statics */
  16.  
  17. BOOL CALLBACK DlgProcSelectIcon(HWND hDlg, UINT message,
  18.     WPARAM wParam, LPARAM lParam);
  19. static BOOL InitSelectIcon(HWND hDlg);
  20. static void EndSelectIcon(HWND hDlg);
  21. static void OnOK(HWND hDlg);
  22. static void OnMeasureItem(HWND hDlg, LPARAM lParam);
  23. static void OnDrawItem(LPARAM lParam);
  24. static void OnBrowse(HWND hDlg);
  25.  
  26. static char* m_fname_index;
  27. static HINSTANCE m_hInst;
  28.  
  29. /*-----------------------------------------------------------------
  30.    open icon selecting dialog
  31.    
  32.    fname_index [IN/OUT]:
  33.    executable file -> "C:\WINDOWS\SYSTEM\SHELL32.DLL,8"
  34.    other           -> "C:\TCLOCK\NIKO.BMP"
  35. -------------------------------------------------------------------*/
  36. BOOL SelectIconInDLL(HINSTANCE hInst, HWND hDlg, char* fname_index)
  37. {
  38.     m_hInst = hInst;
  39.     m_fname_index = fname_index;
  40.     if(DialogBox(hInst, MAKEINTRESOURCE(IDD_SELECTICON),
  41.         hDlg, DlgProcSelectIcon) != IDOK) return FALSE;
  42.     return TRUE;
  43. }
  44.  
  45. /*------------------------------------------------
  46.   dialog procedure
  47. --------------------------------------------------*/
  48. BOOL CALLBACK DlgProcSelectIcon(HWND hDlg, UINT message,
  49.     WPARAM wParam, LPARAM lParam)
  50. {
  51.     switch(message)
  52.     {
  53.         case WM_INITDIALOG:
  54.             if(!InitSelectIcon(hDlg))
  55.                 EndDialog(hDlg, IDCANCEL);
  56.             return TRUE;
  57.         case WM_MEASUREITEM:
  58.             OnMeasureItem(hDlg, lParam);
  59.             return TRUE;
  60.         case WM_DRAWITEM:
  61.             OnDrawItem(lParam);
  62.             return TRUE;
  63.         case WM_COMMAND:
  64.         {
  65.             WORD id;
  66.             id = LOWORD(wParam);
  67.             switch (id)
  68.             {
  69.                 case IDC_SANSHOICON:
  70.                     OnBrowse(hDlg);
  71.                     break;
  72.                 case IDOK:
  73.                     OnOK(hDlg);
  74.                 case IDCANCEL:
  75.                     EndSelectIcon(hDlg);
  76.                     EndDialog(hDlg, id);
  77.                     break;
  78.             }
  79.             return TRUE;
  80.         }
  81.     }
  82.     return FALSE;
  83. }
  84.  
  85. /*------------------------------------------------
  86.   initialize
  87. --------------------------------------------------*/
  88. BOOL InitSelectIcon(HWND hDlg)
  89. {
  90.     int i, count, index;
  91.     HICON hicon, hiconl;
  92.     char msg[MAX_PATH];
  93.     char fname[MAX_PATH], num[10];
  94.     
  95.     // common/tclang.c
  96.     SetDialogLanguage(hDlg, "SelectIcon", g_hfontDialog);
  97.     
  98.     parse(fname, m_fname_index, 0, MAX_PATH);
  99.     parse(num, m_fname_index, 1, 10);
  100.     if(num[0] == 0) index = 0;
  101.     else index = atoi(num);
  102.     
  103.     count = (int)ExtractIcon(m_hInst, fname, (UINT)-1);
  104.     if(count == 0)
  105.     {
  106.         strcpy(msg, MyString(IDS_NOICON, "NoIcon"));
  107.         strcat(msg, "\n");
  108.         strcat(msg, fname);
  109.         MessageBox(hDlg, msg, "TClock", MB_OK|MB_ICONEXCLAMATION);
  110.         return FALSE;
  111.     }
  112.     
  113.     EndSelectIcon(hDlg);
  114.     SendDlgItemMessage(hDlg, IDC_LISTICON, LB_RESETCONTENT, 0, 0);
  115.     
  116.     for(i = 0; i < count; i++)
  117.     {
  118.         hiconl = NULL; hicon = NULL;
  119.         ExtractIconEx(fname, i, &hiconl, &hicon, 1);
  120.         if(hiconl) DestroyIcon(hiconl);
  121.         SendDlgItemMessage(hDlg, IDC_LISTICON, LB_ADDSTRING, 0,
  122.             (LPARAM)hicon);
  123.     }
  124.     SetDlgItemText(hDlg, IDC_FNAMEICON, fname);
  125.     SendDlgItemMessage(hDlg, IDC_LISTICON, LB_SETCURSEL,
  126.         index, 0);
  127.     strcpy(m_fname_index, fname);
  128.     return TRUE;
  129. }
  130.  
  131. /*------------------------------------------------
  132.   clean up
  133. --------------------------------------------------*/
  134. void EndSelectIcon(HWND hDlg)
  135. {
  136.     int i, count;
  137.     HICON hicon;
  138.     count = SendDlgItemMessage(hDlg, IDC_LISTICON, LB_GETCOUNT, 0, 0);
  139.     for(i = 0; i < count; i++)
  140.     {
  141.         hicon = (HICON)SendDlgItemMessage(hDlg, IDC_LISTICON,
  142.             LB_GETITEMDATA, i, 0);
  143.         if(hicon) DestroyIcon(hicon);
  144.     }
  145. }
  146.  
  147. /*------------------------------------------------
  148.   "OK" button
  149. --------------------------------------------------*/
  150. void OnOK(HWND hDlg)
  151. {
  152.     char num[10];
  153.     int index;
  154.     
  155.     GetDlgItemText(hDlg, IDC_FNAMEICON, m_fname_index, MAX_PATH);
  156.     index = SendDlgItemMessage(hDlg, IDC_LISTICON, LB_GETCURSEL, 0, 0);
  157.     wsprintf(num, ",%d", index);
  158.     strcat(m_fname_index, num);
  159. }
  160.  
  161. /*------------------------------------------------
  162.   WM_MEASUREITEM message
  163. --------------------------------------------------*/
  164. void OnMeasureItem(HWND hDlg, LPARAM lParam)
  165. {
  166.     LPMEASUREITEMSTRUCT pMis;
  167.     RECT rc;
  168.     
  169.     pMis = (LPMEASUREITEMSTRUCT)lParam;
  170.     GetClientRect(GetDlgItem(hDlg, pMis->CtlID), &rc);
  171.     pMis->itemHeight = rc.bottom;
  172.     pMis->itemWidth = 32;
  173. }
  174.  
  175. /*------------------------------------------------
  176.   WM_DRAWITEM message
  177. --------------------------------------------------*/
  178. void OnDrawItem(LPARAM lParam)
  179. {
  180.     LPDRAWITEMSTRUCT pDis;
  181.     HBRUSH hbr;
  182.     COLORREF col;
  183.     RECT rc;
  184.     int cxicon, cyicon;
  185.     
  186.     pDis = (LPDRAWITEMSTRUCT)lParam;
  187.     
  188.     switch(pDis->itemAction)
  189.     {
  190.         case ODA_DRAWENTIRE:
  191.         case ODA_SELECT:
  192.         {
  193.             if(pDis->itemState & ODS_SELECTED)
  194.                 col = GetSysColor(COLOR_HIGHLIGHT);
  195.             else col = GetSysColor(COLOR_WINDOW);
  196.             hbr = CreateSolidBrush(col);
  197.             FillRect(pDis->hDC, &pDis->rcItem, hbr);
  198.             DeleteObject(hbr);
  199.             if(!(pDis->itemState & ODS_FOCUS)) break;
  200.         }
  201.         case ODA_FOCUS:
  202.         {
  203.             if(pDis->itemState & ODS_FOCUS)
  204.                 col = GetSysColor(COLOR_WINDOWTEXT);
  205.             else
  206.                 col = GetSysColor(COLOR_WINDOW);
  207.             hbr = CreateSolidBrush(col);
  208.             FrameRect(pDis->hDC, &pDis->rcItem, hbr);
  209.             DeleteObject(hbr);
  210.             break;
  211.         }
  212.     }
  213.     
  214.     if(pDis->itemData == 0) return;
  215.     
  216.     cxicon = GetSystemMetrics(SM_CXSMICON);
  217.     cyicon = GetSystemMetrics(SM_CYSMICON);
  218.     
  219.     CopyRect(&rc, &(pDis->rcItem));
  220.     DrawIconEx(pDis->hDC,
  221.         rc.left + (rc.right - rc.left - cxicon)/2,
  222.         rc.top + (rc.bottom - rc.top - cyicon)/2,
  223.         (HICON)pDis->itemData,
  224.         cxicon, cyicon, 0, NULL, DI_NORMAL);
  225. }
  226.  
  227. /*------------------------------------------------
  228.   "Browse" button
  229. --------------------------------------------------*/
  230. void OnBrowse(HWND hDlg)
  231. {
  232.     char *filter = "Bitmap, Icon (*.bmp, *.ico)\0*.bmp;*.ico\0"
  233.         "Executable (*.exe, *.dll)\0*.exe;*.dll\0"
  234.         "All (*.*)\0*.*\0\0";
  235.     char deffile[MAX_PATH], fname[MAX_PATH];
  236.     HFILE hf;
  237.     char head[2];
  238.     
  239.     GetDlgItemText(hDlg, IDC_FNAMEICON, deffile, MAX_PATH);
  240.     
  241.     if(!SelectMyFile(m_hInst, hDlg, filter, 2, deffile, fname))
  242.         return;
  243.     
  244.     hf = _lopen(fname, OF_READ);
  245.     if(hf == HFILE_ERROR) return;
  246.     _lread(hf, head, 2);
  247.     _lclose(hf);
  248.     strcpy(m_fname_index, fname);
  249.     
  250.     if(head[0] == 'M' && head[1] == 'Z') // Executable
  251.     {
  252.         if(InitSelectIcon(hDlg))
  253.             PostMessage(hDlg, WM_NEXTDLGCTL,
  254.                 (WPARAM)GetDlgItem(hDlg, IDC_LISTICON), TRUE);
  255.     }
  256.     else
  257.     {
  258.         EndSelectIcon(hDlg);
  259.         EndDialog(hDlg, IDOK);
  260.     }
  261. }
  262.  
  263.